package com.dingwen.treasure.business.factory;

import cn.hutool.core.map.MapUtil;
import com.dingwen.treasure.business.service.PayService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * pay工厂
 *
 * @author dingwen
 * @date 2022/04/25
 */
@Component
@RequiredArgsConstructor
@Slf4j
public class PayFactory implements ApplicationContextAware {

    /**
     * 应用程序上下文
     */
    private ApplicationContext applicationContext;

    /**
     * 付费服务
     */
    public static Map<String, PayService> PAY_SERVICE_MAP = MapUtil.newHashMap(2);

    /**
     * 将所有支付实现类加载到 pay 工厂
     */
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;

        // 按支付服务名称实现
        implementsByPayServiceName();

        // 按支付服务获取支付类型实现
//        implementsByPayServiceGetPayType();
    }

    /**
     * 按支付服务名称实现: 支付实现类到名称作为 pay 工厂的 Key
     */
    private void implementsByPayServiceName() {
        PAY_SERVICE_MAP = applicationContext.getBeansOfType(PayService.class);
    }

    /**
     * 按支付服务获取支付类型实现: 支付实现类返回的类型作为 pay 工厂的 key
     */
    private void implementsByPayServiceGetPayType() {
        Map<String, PayService> beansOfType = applicationContext.getBeansOfType(PayService.class);
        beansOfType.forEach((payType, payService) -> PAY_SERVICE_MAP.put(payService.getPayType(), payService));
    }
}
